################################
#
# 对y=ax^2+bx+cz+d求导（）
# αy/αx=2ax+b
# αy/αz=c
# a=6,b=7,c=8,d=9
#
#################################

"""
Author :  fc
date :    2021/6/9
"""

import torch
from torch import autograd


if __name__ == '__main__':
    # 设置常量
    A = 6
    B = 7
    C = 8
    D = 9
    # 设置变量
    x = torch.tensor(4., requires_grad=True)  # 设置x可以自动求导，初值为4(必须为浮点数)
    z = torch.tensor(5., requires_grad=True)

    # 目标函数
    y = A * x ** 2 + B * x + C * z + D  # αy/αx = 2*6*4 + 7=55 ; αy/αz=C=8

    """ 
       print(f"自动求梯度前：{x.grad, z.grad}")  #梯度求解错误示范
    """

    grads = autograd.grad(y, [x, z])      # 自动求梯度autograd.grad(y,[x,z]) ,第一个参数为目标函数，第二个参数是list（需要求梯度的变量集）

    print(grads[0],grads[1])             # 这里的输出和下面的输出是不一样的
    print(f"自动求梯度：对x的梯度={grads[0]}, 对y的梯度={grads[1]}")
